package com.shujia.common_util.three;

import org.junit.Test;

import java.util.Objects;

public class Person {

    private String name;
    private int age;


    @Test
    public void test2() {
        Person p1 = new Person();
        Person p2 = new Person();
        System.out.println(p1.hashCode());
        System.out.println(p1.toString());
        System.out.println(p1.equals(p2));

        System.out.println(Objects.hash(p1));
        System.out.println(Objects.toString(p1));
        System.out.println(Objects.equals(p1, p2));
    }


    @Test
    public void test1() {
        String str = "abc";
        str = null; // NullPointerException
        // System.out.println(str.equals("abc"));

        // String equals 常量.equals(变量), 规避空指针的异常
        System.out.println("abc".equals(str));
    }

    public static void main(String[] args) {
        Person p1 = new Person();
        Person p2 = new Person();
        Person p3 = new Person();
        System.out.println(p1.equals(1));
        System.out.println(p2.equals("abc"));

        p1.name = "zs";
        p1.age = 20;
        p3.name = "zs";
        p3.age = 20;
        System.out.println(p1.equals(p3));
    }

    // 通过IDEA自动生成equals方法
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        // return (a == b) || (a != null && a.equals(b));
        return age == person.age && Objects.equals(name, person.name);
    }


//    public boolean equals(Object obj) {
//        /*
//        equals从写规则
//        两个对象的地址值相同，返回true
//        参数为null, 并且两个对象不属于同一个类，返回false
//        比较属性值，如果属性相同，返回true；不相同返回false
//         */
//        if (this == obj) {
//            return true;
//        }
//
//        // 比较属性值之前需要校验两个对象是不是同一个类的
//        if (obj == null || getClass() != obj.getClass()) {
//            return false;
//        }
//
//        // 比较属性值, 如果属性相同，返回true；不相同返回false
//        Person target = (Person) obj;
//        // 注意: 如果重写equals方法的类中包含String属性, 比较属性值时需要使用equals方法而不是”==”
//        // name没有赋值
//    if (age == target.age && name != null && name.equals(target.name)) {
//            return true;
//        }
//        return false;
//    }
}
